'use strict'
// 面向后台管理系统的 认证服务

const { AdminUserModel } = require('../../models')
const jwt = require('jwt-simple')
const passwordUtility = require('../../commons/password_utility')
const _ = require('lodash')
const TOKEN_SECRET = 'dsgafg2@aifei_admin_user'
const TOKEN_EXPIRED = 3600 * 24 * 1 // 7天有效
/**
 * 登录操作 并返回token
 * @param {*} username 用户名
 * @param {*} password 密码
 * @return {Promise<[object, string]>} token
 */
async function login(username, password) {

  let _user = await AdminUserModel.findOne({
    username: username
  })

  if (!_user) {
    return ['auth.username_or_password_error']
  }

  if (!passwordUtility.verifyPw(password, _user.password)) {
    return ['auth.username_or_password_error']
  }

  if(_user.disable) {
    return ['auth.disable']
  }

  function updateLoginTime (id) {
    AdminUserModel.updateOne({ _id: id }, { $set: { login_time: Date.now() }}).exec()
  }
  updateLoginTime(_user._id)

  const payload = {
    _id: _user._id,
    flag: passwordUtility.cookPw(_user.password), // 实现修改密码后 其他的token无效 达到安全性
    exp: (TOKEN_EXPIRED * 1000) + Date.now(),
  }

  const token = jwt.encode(payload, TOKEN_SECRET)

  return [null, token]
}

/**
 * 验证token并返回用户数据
 * @param {*} token
 * @return {*}
 */
async function validateToken(token) {
  let decoded
  try {
    decoded = jwt.decode(token, TOKEN_SECRET)
  } catch (err) {
    return ['auth.invalid_token']
  }

  if (decoded.exp <= Date.now()) {
    return ['auth.expired_token']
  }

  let _user = await AdminUserModel.findById(decoded._id).lean()
  
  if (!_user) {
    return ['common.not_exist']
  }
  if (!passwordUtility.verifyPw(_user.password, decoded.flag)) { // 实现修改密码后 其他的token无效 达到安全性
    return ['auth.invalid_token']
  }
  if (_user.disable) {
    return 'auth.disable'
  }
  if (!_user.role_type) { // 没有角色信息 这不科学
    return ['common.not_exist']
  }

  _user = _.omit(_user, ['password']) // 去除password字段
  return [null, _user]
}


module.exports = {
  login,
  validateToken,
}
